package com.ice.delay.task.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ice.delay.task.core.constant.ServerErrorCode;
import com.ice.delay.task.core.model.DelayTaskModule;
import com.ice.delay.task.dao.DelayTaskModuleDao;
import com.ice.delay.task.service.DelayTaskModuleService;
import com.ice.delay.task.vo.req.DelayTaskModuleEnabledVoReq;
import com.ice.delay.task.vo.req.DelayTaskModuleQueryReq;
import com.ice.delay.task.vo.req.DelayTaskModuleUpdateVoReq;
import com.ice.delay.task.vo.req.DelayTaskModuleVoReq;
import com.ice.delay.task.vo.res.DelayTaskModuleVoRes;
import com.ice.framework.common.base.RPage;
import com.ice.framework.common.exception.BusinessException;
import com.ice.framework.common.util.ObjectTransformUtil;
import com.ice.framework.mybatisplus.query.LambdaQueryWrapperX;
import com.ice.framework.mybatisplus.util.MyBatisUtils;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 延迟任务模块
 *
 * @author wangwei
 * @Date 2022/4/21 21:35
 */
@Service
public class DelayTaskModuleServiceImpl extends ServiceImpl<DelayTaskModuleDao, DelayTaskModule> implements DelayTaskModuleService {

    @Override
    public void saveDelayTaskModule(DelayTaskModule delayTaskModule) {
        DelayTaskModule delayTaskQuery = new DelayTaskModule();
        delayTaskQuery.setModuleCode(delayTaskModule.getModuleCode());
        DelayTaskModule delayTaskModuleDto = this.getBaseMapper().find(delayTaskModule);
        if (ObjectUtil.isNotNull(delayTaskModuleDto)) {
            throw new BusinessException(ServerErrorCode.MODULE_CODE_EXISTS);
        }
        delayTaskModule.setCreateTime(new Date());
        this.getBaseMapper().insert(delayTaskModule);
    }

    @Override
    public List<DelayTaskModule> listDelayTaskModule() {
        return this.getBaseMapper().selectList(new LambdaQueryWrapper<>());
    }

    @Override
    public RPage<DelayTaskModuleVoRes> pageModule(RPage<DelayTaskModuleVoReq> page) {
        IPage<DelayTaskModule> iPage = new Page<>(page.getCurrent(), page.getSize());
        IPage<DelayTaskModule> resultPage = this.getBaseMapper().selectPage(iPage, new LambdaQueryWrapperX<DelayTaskModule>().eqIfPresent(DelayTaskModule::getModuleName, ObjectUtil.isEmpty(page.getParameter()) ? null : page.getParameter().getModuleName()));
        return MyBatisUtils.transmit(resultPage, DelayTaskModuleVoRes.class);
    }

    @Override
    public DelayTaskModuleVoRes findModule(DelayTaskModuleQueryReq module) {
        DelayTaskModule delayTaskModule = this.getBaseMapper().selectById(module.getId());
        if (ObjectUtil.isEmpty(delayTaskModule)) {
            throw new BusinessException(ServerErrorCode.ERR_DELAY_MODULE_NOT_FOUND);
        }
        return ObjectTransformUtil.transfer(delayTaskModule, DelayTaskModuleVoRes.class);
    }

    @Override
    public void updateModule(DelayTaskModuleUpdateVoReq updateModule) {
        DelayTaskModule delayTaskModule = this.getBaseMapper().selectById(updateModule.getId());
        if (ObjectUtil.isEmpty(delayTaskModule)) {
            throw new BusinessException(ServerErrorCode.ERR_DELAY_MODULE_NOT_FOUND);
        }
        delayTaskModule.setModuleName(updateModule.getModuleName());
        this.getBaseMapper().updateById(delayTaskModule);
    }


    @Override
    public void enabled(DelayTaskModuleEnabledVoReq delayTaskModuleEnabledVoReq) {
        DelayTaskModule delayTaskModule = this.getBaseMapper().selectById(delayTaskModuleEnabledVoReq.getId());
        if (ObjectUtil.isEmpty(delayTaskModule)) {
            throw new BusinessException(ServerErrorCode.ERR_DELAY_MODULE_NOT_FOUND);
        }
        if (delayTaskModule.getEnabled().equals(delayTaskModuleEnabledVoReq.getEnabled())) {
            throw new BusinessException(ServerErrorCode.MODULE_ENABLED_NOT_CORRECT);
        }
        delayTaskModule.setEnabled(delayTaskModuleEnabledVoReq.getEnabled());
        delayTaskModule.setUpdateTime(new Date());
        this.getBaseMapper().updateById(delayTaskModule);
    }
}
